// 页面加载混入 - 提供通用的页面加载功能
const pageLoadingManager = require('./pageLoadingManager')

// 页面加载混入
const pageLoadingMixin = {
  data: {
    globalLoading: false,
    globalSkeletonType: 'default',
    globalLoadingText: '加载中...'
  },

  // 页面进入时显示加载效果
  onPageEnter(pageName, options = {}) {
    pageLoadingManager.onPageEnter(pageName, options)
  },

  // 页面数据加载完成
  onPageDataLoaded(pageName) {
    pageLoadingManager.onPageDataLoaded(pageName)
  },

  // 更新全局加载状态
  updateGlobalLoading(data) {
    this.setData({
      globalLoading: data.globalLoading,
      globalSkeletonType: data.globalSkeletonType || this.data.globalSkeletonType,
      globalLoadingText: data.globalLoadingText || this.data.globalLoadingText
    })
  },

  // 显示全局加载
  showGlobalLoading(options = {}) {
    const app = getApp()
    app.showGlobalLoading(options)
  },

  // 隐藏全局加载
  hideGlobalLoading() {
    const app = getApp()
    app.hideGlobalLoading()
  }
}

// 页面加载装饰器 - 自动包装页面生命周期方法
const withPageLoading = (pageName, options = {}) => {
  return function(pageConfig) {
    const {
      skeletonType = 'default',
      loadingText = '页面加载中...',
      loadingTime = 800,
      showOnReturn = false
    } = options

    // 保存原始方法
    const originalOnLoad = pageConfig.onLoad
    const originalOnReady = pageConfig.onReady
    const originalOnShow = pageConfig.onShow

    // 包装onLoad方法
    pageConfig.onLoad = function(options) {
      // 显示页面加载效果
      pageLoadingManager.onPageEnter(pageName, {
        skeletonType,
        loadingText,
        loadingTime
      })
      
      // 执行原始onLoad方法
      if (originalOnLoad) {
        originalOnLoad.call(this, options)
      }
    }

    // 包装onReady方法
    pageConfig.onReady = function() {
      // 执行原始onReady方法
      if (originalOnReady) {
        originalOnReady.call(this)
      }
      
      // 页面准备完成，隐藏加载效果
      pageLoadingManager.onPageDataLoaded(pageName)
    }

    // 包装onShow方法
    pageConfig.onShow = function() {
      // 执行原始onShow方法
      if (originalOnShow) {
        originalOnShow.call(this)
      }
      
      // 如果是从其他页面返回，显示短暂加载效果
      if (showOnReturn) {
        pageLoadingManager.onPageEnter(pageName, {
          loadingTime: 500,
          loadingText: '页面刷新中...'
        })
      }
    }

    // 添加更新全局加载状态的方法
    pageConfig.updateGlobalLoading = function(data) {
      this.setData({
        globalLoading: data.globalLoading,
        globalSkeletonType: data.globalSkeletonType || skeletonType,
        globalLoadingText: data.globalLoadingText || loadingText
      })
    }

    // 合并混入数据
    Object.assign(pageConfig.data, pageLoadingMixin.data)

    return pageConfig
  }
}

// 页面加载模板 - 提供wxml模板
const pageLoadingTemplate = `
<!-- 全局加载组件 -->
<global-loading 
  global-loading="{{globalLoading}}" 
  global-skeleton-type="{{globalSkeletonType}}" 
  global-loading-text="{{globalLoadingText}}">
</global-loading>
`

// 导出
module.exports = {
  pageLoadingMixin,
  withPageLoading,
  pageLoadingTemplate,
  pageLoadingManager
}
